/*
 * @Author: liu
 * @Date: 2024-04-21 13:02:29
 * @LastEditors: liu
 * @LastEditTime: 2024-05-08 00:24:37
 * @FilePath: \yyx_ser_ts\app\controller\CategoryController.ts
 * @Description:课程相关控制器
 * 天道酬勤
 */
import { Context } from 'koa'
import response from '../../utils/response'
import { get, post, controller, use, unifyUse } from '../router/decorator/index'
import commonMiddleware from '../middleware/common'
import CategoryService from '../service/CategoryService'
import { CategoryException } from '../exception/HttpException'

/** 装饰器router class */
export type RouterController<T extends string> = {
  [key in T]: (ctx: Context) => Promise<void>
}

type MethodName = 'getName' | 'postName' | 'deleteName'

@controller('/category')
@unifyUse<MethodName>(commonMiddleware)
class CategoryController {
  //通过ID获取单门课程信息
  @get('/getAllCategory')
  async getAllCategory(ctx: Context) {
    try {
      const res = await CategoryService.findAllCategories()

      //第二种实现方法
      let arr = <any>[]
      res.forEach((item, index) => {
        arr[index] = {
          id: item['id'],
          title: item['title'],
          pid: item['parent_id']
        }
      })
      //  console.log(arr, 'arr')
      //  let obj = tree(arr)

      //console.log(obj['1'] === arr[0]) //true

      function tree(arr: []) {
        let obj: { [key: string]: any } = {}
        arr.forEach((item: { [key: string]: any }) => {
          //item是一个对象，obj[item.id]也是一个对象，这两个对象指向同一个地址
          obj[item.id] = item
        })
        //   console.log(obj, 'obj')

        //     return obj
        let val = <any>[]
        arr.forEach((item: { [key: string]: any }) => {
          console.log(val, 'ccc')
          let parent = obj[item.pid]

          //注意这里的obj和arr 还有val 中的对象指向同一个内存地址，所以在一个对象发生变化后，其他的也会发生变化！！！！
          if (parent) {
            //1、只要“||”前面为false,不管“||”后面是true还是false，都返回“||”后面的值。
            ;(parent.children || (parent.children = [])).push(item)
          } else {
            val.push(item)
          }
          //这里很关键的一点就是val的
          //注意这里的obj和arr 还有val 中的对象指向同一个内存地址，所以在一个对象发生变化后，其他的也会发生变化！！！！
          //第一次循环的时候得到[ { id: 1, title: '前端', pid: '0' } ]，数组里的对象和arr[0]的对象指向同一个地址
          console.log(val, 'val')
        })

        return val
      }

      let data = tree(arr)

      response.success(ctx, data, '获取全部序列化后分类成功！')
    } catch (error: any) {
      throw new CategoryException(error, error.message)
    }
  }

  @get('/getAllCategory1')
  async getAllCategory1(ctx: Context) {
    try {
      const res = await CategoryService.findAllCategories()
      response.success(ctx, res, '获取全部未序列化后分类成功！')
    } catch (err) {}
  }
}

export default new CategoryController()
